package com.example.代理模式.CGLIB动态代理;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理调用处理器
 */
public class DynamicProxy implements MethodInterceptor {

    private Enhancer enhancer;

    public Object getProxy(Class clazz) {
        enhancer = new Enhancer();

        // 设置需要代理的类
        enhancer.setSuperclass(clazz);
        //设置需要代理的类
        enhancer.setCallback(this);

        // 用于创建无参的目标对象代理类，对于有参构造器则调用Enhancer.create(Class[] argumentTypes, Object[] arguments)，第一个参数表示参数类型，第二个参数表示参数的值
        return enhancer.create();
    }

    /**
     *
     * @param o Subject类, 即被代理的类
     * @param method Method表示拦截的方法
     * @param objects 被代理类的参数
     * @param methodProxy MethodProxy表示对方法的代理，invokeSuper方法表示对被代理对象方法的调用
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("调用前");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("调用后");

        return result;
    }
}
